package com.copa.l20;

import java.util.Stack;

/**
 * @author copa
 * @createDate 2022-04-27 15:14
 * @function 栈存储的方法
 */
public class Test1 {

    public boolean isValid(String s) {
        // 定义一个栈，专门用来存储 ( [ {
        Stack<Character> stack = new Stack<>();
        // 对s字符串进行遍历
        for (char c : s.toCharArray()) {
            // 如果有如下符号，存入栈
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else {
                // 能进到这里就证明c 为 ) ] }
                // 如果该栈没有，就证明这些右括号都是单身狗（不匹配）
                if (stack.isEmpty()) {
                    return false;
                }
                // 这里是我第一次写的，过于啰嗦了，其实不用peek()判断也行，直接取pop的元素判断
//                if ((c == ')' && stack.peek() == '(') || (c == ']' && stack.peek() == '[') || (c == '}' && stack.peek() == '{')) {
//                    stack.pop();
//                } else {
//                    return false;
//                }
                Character pop = stack.pop();
                if (!((c == ')' && pop == '(') || (c == ']' && pop == '[') || (c == '}' && pop == '{'))) {
                    return false;
                }
            }
        }
        // 这里是我第一次写的，过于啰嗦了，改成三目运算法即可
//        if (!stack.isEmpty()) {
//            return false;
//        }
//        return true;
        return stack.isEmpty() ? true : false;
    }

    public static void main(String[] args) {
        System.out.println(new Test1().isValid("({()})"));
    }
}
